import torch

# 定义训练数据
x_data = [1.0, 2.0, 3.0]  # 输入数据x的列表
y_data = [2.0, 4.0, 6.0]  # 对应的输出数据y的列表

# 初始化权重w为一个Tensor，并设置其需要计算梯度
w = torch.tensor([1.0])  # 初始化权重w为1.0
w.requires_grad = True  # 设置w需要计算梯度，以便后续进行梯度下降

# 定义 前向传播函数
def forward(x):
    return x * w

# 定义损失函数
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

# 打印训练前的预测结果
print("predict (before training)", 4, forward(4).item())

# 训练过程
for epoch in range(100):  # 进行100轮训练
    for x, y in zip(x_data, y_data):  # 遍历每个训练数据对
        l = loss(x, y)  # 计算当前数据对的损失
        l.backward()  # 通过反向传播计算梯度
        print('\tgrad:', x, y, w.grad.item())  # 打印当前数据对下的梯度值
        w.data = w.data - 0.01 * w.grad.data  # 使用梯度下降更新权重w，学习率为0.01

        w.grad.data.zero_()  # 将梯度清零，为下一次梯度计算做准备

    print('progress:', epoch, l.item())  # 打印当前轮次的损失值

# 打印训练后的预测结果
print("predict (after training)", 4, forward(4).item())  # 打印4的预测值，使用.item()获取标量值

